package model;

import java.util.List;

import ar.edu.unq.tpi.pconc.Channel;


public class Ciudad extends ZonaBatalla{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 3340674822240741333L;
	//private Channel<Unidad> puertaDeIngresoACiudad;
	private List<Ciudad> ciudadesConectadas;
	private Castillo castilloDominante;
	private int numeroDeCiudad;
	private int canal;
	private Castillo castillo;

	
	public Castillo getCastillo() {
		return castillo;
	}

	public void setCastillo(Castillo castillo) {
		this.castillo = castillo;
	}

	public Ciudad(int unNumeroDeCiudad) {
		// Todo el canal deberia ser el numero 10 mas el numero de ciudad.
		setCanal(10 + unNumeroDeCiudad);
		//this.puertaDeIngresoACiudad = new Channel<Unidad>(canal);
		this.setNumeroDeCiudad(unNumeroDeCiudad);
		this.setCiudadesConectadas(ciudadesConectadas);
	}
	
	public List<Ciudad> getCiudadesConectadas() {
		return this.ciudadesConectadas;
	}

	public int getNumeroDeCiudad() {
		return numeroDeCiudad;
	}

	public void setNumeroDeCiudad(int numeroDeCiudad) {
		this.numeroDeCiudad = numeroDeCiudad;
	}
	
	@Override
	public String toString() {
		return "Ciudad " + this.getNumeroDeCiudad();
	}

	public Castillo getCastilloDominante() {
		return castilloDominante;
	}

	public void setCastilloDominante(Castillo castilloDominante) {
		this.castilloDominante = castilloDominante;
		this.log("El castillo dominante actual es:" + castilloDominante);
	}
	
	public void setUnidadActual(Unidad unidadActual) {
		this.log("La unidad actual es:" + unidadActual);
		this.unidadActual = unidadActual;
		if(unidadActual != null)
			this.setCastilloDominante(unidadActual.getCastillo());
	}
	
	public void solicitarIngresoACiudad(Unidad unaUnidad){
		log("Se solicita permiso de ingresar por parte de : " + unaUnidad);
		Channel<Tupla> puertaDeIngresoACiudad = new Channel<Tupla>(getCanal());
		puertaDeIngresoACiudad.send(new Tupla("entrar", unaUnidad));
	}
	
	public void solicitarSalidaDeCiudad(Unidad unaUnidad){
		log("Se solicita permiso de salir por parte de : " + unaUnidad);
		Channel<Tupla> puertaDeIngresoACiudad = new Channel<Tupla>(getCanal());
		puertaDeIngresoACiudad.send(new Tupla("salir", unaUnidad));
	}

	@Override
	public void asignarAGanadorDeBatalla(Unidad unidad) {
		// TODO Auto-generated method stub	
	}

	public void setCiudadesConectadas(List<Ciudad> ciudadesConectadas) {
		this.ciudadesConectadas = ciudadesConectadas;
	}
	
	@Override
	public void run() {
		Channel<Tupla> puertaDeIngresoACiudad = new Channel<Tupla>(getCanal());
		while (!Mapa.gameOver()) {
			this.log("A la espera de algun pedido de ingreso.");
			
			// MENTIRAAAA //
			Tupla tupla = puertaDeIngresoACiudad.receive();
			this.log("La tubla recibida es:" + tupla.getMensaje() + "-" + tupla.getUnidad().toString());
			Unidad unaUnidad = tupla.getUnidad();
			if (tupla.getMensaje().toLowerCase().equals("entrar")){
				this.setUnidadActual(unaUnidad);
				this.log("Se recibio solicitud de ingreso de " + unaUnidad);
//			} else {
//				this.setUnidadActual(null);
			}
			if(this.getUnidadActual() != null && !this.getUnidadActual().toString().equals(unaUnidad.toString())) {
				// Solo se iniciará una batalla si NO intenta pelear contra si mismo //
				this.log("Se iniciara una batalla " + this.getUnidadActual().toString() + " vs " + unaUnidad.toString());
				iniciarBatalla(unaUnidad);
//				} else {
//					this.setUnidadActual(null);
//					unaUnidad.permitirSalida();
//				}
			} else {
				this.log("Se permite la entrada a " + unaUnidad);
				setUnidadActual(unaUnidad);
				unaUnidad.permitirEntrada();
			}
		}
		this.log("Game Over");
	}
	
	
	private void iniciarBatalla(Unidad unaUnidad) {
		Batalla batalla = new Batalla(this);
//		batalla.comenzarPelea(this.getUnidadActual(), unaUnidad);
		batalla.comenzarPelea(this.getUnidadActual(), unaUnidad);
		(new Channel<Unidad>(850)).receive();
		this.log("Ganador de la batalla es: " +  this.getUnidadActual().toString());
	}
	
	public boolean tieneCastillo(){
		return !(this.castillo == null);
	}

	private void log(String string) {
		System.out.println("[" + this + " ("+ this.getCanal() +")] : " + string);
	}

	public int getCanal() {
		return canal;
	}

	public void setCanal(int canal) {
		this.canal = canal;
	}
	
	
	
}